#include <string>
#include<unordered_map>
#include<regex>



class HttpRequest {
    public:
        std::string _method;    //请求⽅法
        std::string _path;      //资源路径
        std::string _version = "HTTP/1.1";  //协议版本
        std::string _body;    //请求正⽂
        std::smatch _matches; //资源路径的正则提取数据
        std::unordered_map<std::string, std::string> _headers; //头部字段(解析头部字段获得)
        std::unordered_map<std::string, std::string> _params;  //查询字符串(和资源路径相关，解析资源路径获得)
    public:
        void ReSet()//重置HttpRequest 
        {
            _method.clear();
            _path.clear();
            _version = "HTTP/1.1";
            _body.clear();
            std::smatch match;
            _matches.swap(match);
            _headers.clear();
            _params.clear();
        }

        //插入头部字段
        void SetHeader(const std::string& key, const std::string& value) { _headers[key] = value; }
        //判断是否存在指定头部字段
        bool HasHeader(const std::string& key) const { return _headers.find(key)!= _headers.end(); }
        //获取指定头部字段的值
        std::string GetHeader(const std::string& key) const { return _headers.find(key) != _headers.end() ? _headers.at(key) : ""; }

        //插⼊查询字符串
        void SetParam(const std::string& key, const std::string& value){ _params[key] = value; }
        //判断是否有某个指定的查询字符串
        bool HasParam(const std::string& key) const {  return _params.find(key)!= _params.end(); }
        //获取指定查询字符串的值
        std::string GetParam(const std::string& key) const { return _params.find(key) != _params.end() ? _params.at(key) : ""; }

        //获取正⽂⻓度
        size_t BodyLength() const
        {
            // Content-Length: 1234\r\n`
            bool ret = HasHeader("Content-Length");
            if (ret) {
                std::string content_length = GetHeader("Content-Length");
                return std::stoul(content_length);
            }
            return 0;
        }
        //判断是否是长连接
        bool IsKeepAlive() const
        {
            if(HasHeader("Connection") && GetHeader("Connection") == "keep-alive"){
                return true;
            }
            return false;
        }
};





class HttpResponse {
    public:
        int _status;//状态码
        bool _redir_flag;//是否是重定向
        std::string _body;
        std::string _redir_url;
        std::unordered_map<std::string, std::string> _headers;
    public:
        HttpResponse():_status(200),_redir_flag(false){}
        HttpResponse(int status):_status(status),_redir_flag(false){}
        void ReSet()//重置HttpResponse
        {
            _status = 200;
            _redir_flag = false;
            _body.clear();
            _redir_url.clear();
            _headers.clear();
        }
        void SetHeader(const std::string& key, const std::string& value) { _headers[key] = value; }
        bool HasHeader(const std::string& key) const { return _headers.find(key)!= _headers.end(); }
        std::string GetHeader(const std::string& key) const { return _headers.find(key) != _headers.end() ? _headers.at(key) : ""; }
        void SetContent(const std::string& body , const std::string& content_type = "text/html; charset=UTF-8") 
        { 
            _body = body; 
            SetHeader("Content-Type", content_type);
        }
        void SetRedirect(const std::string& url,int status = 302)
        {
            _status = status;
            _redir_flag = true;
            _redir_url = url;
        }
        //判断是否是长连接
        bool IsKeepAlive() const
        {
            if(HasHeader("Connection") && GetHeader("Connection") == "keep-alive"){
                return true;
            }
            return false;
        }

};















